home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / snakeoil.lqr / AREA.C next >
Text File  |  1985-07-06  |  6KB  |  171 lines

  1. /**************************************************************************
  2.  Copyright (c) 1984 All Rights Reserved                    Karl L. Remmler       
  3.  Not for commercial use or profit.                                 (CI-C86)
  4.                                             
  5.    area.c    a program to calculate area of a polygon
  6.          with right angle corners, e.g.
  7.  
  8.          ._______________.
  9.          |             |      ._____.
  10.          |             |____|    |
  11.          |                |        +y
  12.          |           n = 14        |         |
  13.          |     .__.            |         |
  14.          +___|  |      ._____________|    -x <----+-----> +x
  15.         /        |_____|                 |
  16.      (0,0)                         |
  17.                             -y
  18. where n = # of sides.
  19.  
  20. ***************************************************************************/
  21.   
  22. #define HEATH            /* . . . . . . delete this line for IBM          */
  23.  
  24. #define MAXLEN 20
  25. #include "stdio.h"
  26.  
  27. #ifdef HEATH
  28. #include "heath.h"
  29. #else
  30. #include "ibm.h"
  31. #endif
  32.  
  33. double abs(number)
  34. double number;
  35. {
  36.     return(number < 0 ? -number : number);    /* if-then-else idiom */
  37. }
  38.  
  39. char *getline(s)
  40. char s[];
  41. {
  42.    int i;
  43.  
  44.    for(i = 0; i < MAXLEN; i++) {
  45.     s[i] = getchar();
  46.     if (s[i] == '\n') break;
  47.    }
  48.    if(i < MAXLEN) ++i;
  49.    s[i] = '\0';
  50.    return(s);
  51. }
  52.  
  53. main()
  54. {
  55.    int i, n;
  56.    char *getline();
  57.    char strg[MAXLEN + 1];
  58.    float dx = 0, dy = 0;
  59.    float last_x = 0, last_y = 0, area = 0;
  60.    float x_err = 0, y_err = 0, x = 0, y = 0;
  61.    float psum_x = 0, nsum_x = 0, psum_y = 0, nsum_y = 0;
  62.    extern double atof();
  63.  
  64. /******************* . . . instructions for operating program */
  65.    CLS;
  66.    printf("\t\tHOUSE AREA CALCULATION PROGRAM\n");
  67.    printf("\n\t\Copyright (c) 1984  Eigenvalue Technologies\n");
  68.    printf("\nDo you wish instructions? ");
  69.    getline(strg);
  70.    if(strg[0] == 'Y' || strg[0] == 'y') {
  71.       CLS;
  72.       bdos(9,"INSTRUCTIONS:$");
  73.       printf("\nOne useful application of this program is the calculation of");
  74.       printf("\nthe area of a house.  You only need to walk around the house,");
  75.       printf("\nmeasuring the length of each sequential straight line segment");
  76.       printf("\nbounding the house, noting whether the direction is forward");
  77.       printf("\n(up), backward (down), or left and right for each respective");
  78.       printf("\nsegment.  In fact, if there is one side (segment) that is");
  79.       printf("\ndifficult to measure, consider it as the last segment on");
  80.       printf("\nthe boundary, and the program will calculate it for you.\n");
  81.       printf("\nFirst, count the total number of sides (vertical and hori-");
  82.       printf("\nzontal segments) around the periphery.    This should be an ");
  83.       printf("\neven number.  Now, start at a corner (one of the vertices)");
  84.       printf("\nand enter the length of the each segment as you move around");
  85.       printf("\nthe planform periphery.  Count the length as plus if the");
  86.       printf("\ndirection is up or to the right, as you go around the plan-");
  87.       printf("\nform.  Otherwise enter a minus sign on the length, when the");
  88.       printf("\ndirection is down or to the left.\n");
  89.       printf("\nType any character when ready: ");
  90.       bdos(1,0);
  91.       putchar('\07');
  92.    }
  93.  
  94. /***************************** . . clear screen & initialize */
  95.    CLS;
  96.    printf("\nEnter number of sides: ");
  97.    n = atoi(getline(strg));
  98.    i = n - 1;
  99.    putchar('\n');
  100.  
  101. /*************** . . collect measurements in the forever-loop */
  102.    for (;;) {
  103.  
  104. /*************************************** . . do vertical side */
  105.  
  106.       printf("\t\tEnter Side #%d: ", n - i);
  107.       dy = atof(getline(strg));
  108.       y = last_y + dy;
  109.  
  110. /* . . . . . . . . . . . . . . . sum of sides for error check */
  111.       if (dy < 0) nsum_y += dy;
  112.       else psum_y += dy;
  113. /* . . . . . . . . . . . . . . . . increment area calculation */
  114.       area = area + (last_x + x) * (last_y - y);
  115.       last_y = y;
  116.       if (--i <= 0) break;
  117.  
  118.  
  119. /*********************************** . . do horizontal sides */
  120.  
  121.       printf("\t\tEnter Side #%d: ", n - i);
  122.       dx = atof(getline(strg));
  123.       x = last_x + dx;
  124.  
  125. /* . . . . . . . . . . . . . . .sum of sides for error check */
  126.       if (dx > 0) psum_x += dx;
  127.       else nsum_x += dx;
  128.  
  129. /* . . . . . . . . . . . . . . . increment area calculation */
  130.       area = area + (last_x + x) * (last_y - y);
  131.       last_x = x;
  132.       putchar('\n');
  133.       if (--i <= 0) break;
  134.    }
  135.    putchar('\n');
  136.  
  137. /****************************** . . complete area calculation */
  138.    area = area + (last_x * last_y);
  139.    printf("\t\tArea = %0.2f\n", area/2);
  140.  
  141. /******************************* . . calculate possible error */
  142.    dx = 0;
  143.    bdos(9,"\nTo estimate error, enter last side: $");
  144.    dx = atof(getline(strg));
  145.    if (dx != 0) {
  146.    x = last_x + dx;
  147.    if (dx > 0) psum_x += dx;
  148.    else nsum_x += dx;
  149. /* . . . . . . . . . . . . . . . calculate measurement errors */
  150.    x_err = abs(psum_x + nsum_x);
  151.    y_err = abs(psum_y + nsum_y);
  152.    printf("\nCumulative error in horizontal side measurements = +/- ");
  153.    printf("%0.2f", x_err);
  154.    printf("\nCumulative error in  veritcal  side measurements = +/- ");
  155.    printf("%0.2f", y_err);
  156.  
  157. /* . . . . . . . . . . .calculate possible error in area estimate */
  158. /*
  159.    The following algorithm should be replaced with one that is more
  160.    statistically accurate.
  161. */
  162.    area = (x_err * (psum_y - nsum_y)) + (y_err * (psum_x - nsum_x));
  163.    printf("\n\nEstimate of error in Area = +/- %0.2f\n", area/2);
  164.    }
  165.    else {
  166.       x_err = -(psum_x + nsum_x);
  167.       printf("\nCalculated length of last side is %0.2f\n", x_err);
  168.    }
  169.    exit(0);
  170. }
  171.